using Godot;
using System;
using Smr;
using Smr.枚举;

public partial class 玩家场景 : Control
{
    [Signal] public delegate void 信号经验被改变EventHandler();
    [Export] private Label 名称标签;
    [Export] private Label 称谓标签;
    [Export] private Label 阴德标签;
    [Export] private Label 阳寿标签;
    [Export] private ProgressBar 经验条;

    public override void _EnterTree()
    {
        游戏管理.置组件实例("玩家场景", this);
    }

    public override void _Ready()
    {
        更新玩家基础属性();
    }

    public void 更新玩家基础属性()
    {
        名称标签.Text = 游戏存档.玩家.基础属性.名称;
        称谓标签.Text = 游戏存档.玩家.基础属性.称谓.ToString() + " · " + 游戏存档.玩家.基础属性.职级;
        阳寿标签.Text = 游戏存档.玩家.基础属性.阳寿.ToString();
        阴德标签.Text = 游戏存档.玩家.基础属性.阴德.ToString();
        经验条.MaxValue = 取当前职级经验上限();
        经验条.Value = 游戏存档.玩家.基础属性.当前职级经验;
    }

    public void 置玩家阳寿(float 阳寿)
    {
        游戏存档.玩家.基础属性.阳寿 += 阳寿;
        阳寿标签.Text = 游戏存档.玩家.基础属性.阳寿.ToString();

        // 判断玩家阳寿是否耗尽
        if (游戏存档.玩家.基础属性.阳寿 <= 0)
        {
            游戏管理.舞台实例.GetTree().Paused = true;
            游戏管理.日志实例.置失败文本("玩家阳寿已耗尽！");
        }
    }

    public void 置玩家职级经验(int 经验)
    {
        var 当前经验 = 游戏存档.玩家.基础属性.当前职级经验 + 经验;
        var 当前经验上限 = 取当前职级经验上限();
        var 当前职级 = (int)游戏存档.玩家.基础属性.职级 + 1;

        // 经验大于上限 职级大于上限 说明需要进行称谓挑战来晋升
        if (当前经验 >= 当前经验上限 && 当前职级 > (int)E角色职级.十级)
        {
            游戏存档.玩家.基础属性.当前职级经验 = 当前经验上限;
            游戏管理.日志实例.置提醒文本("当前职级达到称谓上限，已无法获得经验，请进行称谓挑战来提升您的称谓吧！");
        }
        // 经验大于上限 职级小于上限 说明升级职级 需要增加属性点数
        else if (当前经验 >= 当前经验上限 && 当前职级 < (int)E角色职级.十级)
        {
            游戏存档.玩家.基础属性.当前职级经验 = 当前经验 - 当前经验上限;
            游戏存档.玩家.基础属性.职级 = (E角色职级)当前职级;
            游戏存档.玩家.基础属性.未分配的点数 += 4;
        }
        else
        {
            游戏存档.玩家.基础属性.当前职级经验 = 当前经验;
        }

        更新玩家基础属性();

        EmitSignal(SignalName.信号经验被改变);
    }

    public float 取当前职级经验上限()
    {
        return 配置.职级经验上限数组[(int)游戏存档.玩家.基础属性.称谓 * 10 + (int)游戏存档.玩家.基础属性.职级];
    }
}
